package com.fauks.gmall.cart.service;


import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.fauks.gmall.bean.OmsCartItem;
import com.fauks.gmall.cart.mapper.CartMapper;
import com.fauks.gmall.service.CartService;
import com.fauks.gmall.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import tk.mybatis.mapper.entity.Example;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private CartMapper cartMapper;

    @Autowired
    private RedisUtils redisUtils;

    @Override
    public OmsCartItem cartExistsInDbByMember(String skuId, String memberId) {
        OmsCartItem cartItem = new OmsCartItem();
        cartItem.setProductSkuId(skuId);
        cartItem.setMemberId(memberId);
        return cartMapper.selectOne(cartItem);
    }

    @Override
    public void saveCartItem(OmsCartItem newCartItem) {
        cartMapper.insert(newCartItem);
    }

    @Override
    public void updateCartItem(OmsCartItem cartItemByDb) {
        Example example = new Example(OmsCartItem.class);
        //根据id更新购买数量
        example.createCriteria().andEqualTo("id", cartItemByDb.getId());
        cartMapper.updateByExampleSelective(cartItemByDb, example);
    }

    @Override
    public void flushCartCache(String memberId) {
        OmsCartItem omsCartItem = new OmsCartItem();
        omsCartItem.setMemberId(memberId);
        List<OmsCartItem> cartList = cartMapper.select(omsCartItem);
        String key = "user:" + memberId + ":cart";
        //使用hash存储用户购物车数据，方便更新操作时只更新一个sku
        Jedis jedis = redisUtils.getJedis();
        Map<String, String> cartSkuMap = new HashMap<>();
        for (OmsCartItem cartItem : cartList) {
            cartSkuMap.put(cartItem.getProductSkuId(), JSON.toJSONString(cartItem));
        }
        jedis.hmset(key, cartSkuMap);
    }

    @Override
    public List<OmsCartItem> cartList(String memberId) {
        Jedis jedis = redisUtils.getJedis();
        List<OmsCartItem> cartItemList = null;
        try {
            cartItemList = new ArrayList<>();
            List<String> hvals = jedis.hvals("user:" + memberId + ":cart");
            if (hvals != null && hvals.size() > 0) {
                //缓存中有数据
                for (String hval : hvals) {
                    OmsCartItem cartItem = JSON.parseObject(hval, OmsCartItem.class);
                    cartItemList.add(cartItem);
                }
            } else {
                //从数据库查询
                OmsCartItem omsCartItem = new OmsCartItem();
                omsCartItem.setMemberId(memberId);
                cartItemList = cartMapper.select(omsCartItem);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            jedis.close();
        }
        return cartItemList;
    }
}
